#include<memory>
#include<unistd.h>
#include <stdlib.h>
#include"BlockingQueue.h"
#include"Task.h"
#include <string.h>
#define PRODUCT_NUM 10 //生产者个数
#define CONSUMER_NUM 5 //消费者个数

void* Producter(void*arg)
{
    BlockingQueue<Car>* bqptr=static_cast<BlockingQueue<Car>*>(arg);
    //生产者如何获取数据？数据从哪来？？
    int len =strlen(opera_);
    while( true)
    {

    const char c=opera_[rand()%len];
    Car car(c);
    bqptr->Push(car);
    printf("i am a producter !add a Task! Task is:%c, tid is:%d \n",car.GetOp(),pthread_self());
    sleep(1);
    //获取到数据之后把数据放进交易场所
    }
    return nullptr;
}
void* Consumer(void*arg)
{
    BlockingQueue<Car>* bqptr=static_cast<BlockingQueue<Car>*>(arg);
    int i=1;
while(true)
{
    //消费者获取数据-> 处理数据 -> 处理结果？
   Car car= bqptr->Pop();//获取数据
   car();//处理数据
    printf("i am a consummer!! i get a task !!  task is:%c, tid is :%d\n",car.GetOp(),pthread_self());
    sleep(1);
}
return nullptr;
}
int main()
{
    srand(time(NULL));//种一个随机数种子
   BlockingQueue<Car>* bqptr=new BlockingQueue<Car>();//1个交易场所，把这个指针通过线程入口函数的参数传给它，可以让生产者跟消费者在一特定结构空间里进行数据交易
   //1.2种角色之一生产者
   pthread_t product_id[PRODUCT_NUM];
   for(int i=0;i<PRODUCT_NUM;i++)//批量创建生产者线程
   {
   pthread_create(&product_id[i],nullptr,Producter,bqptr);//
   }
   //2. 2种角色之二消费者
    pthread_t consumer_id[CONSUMER_NUM];
    for(int i=0;i<CONSUMER_NUM;i++)
    {
        pthread_create(&consumer_id[i],nullptr,Consumer,bqptr);
    }

   //等待线程
   for(int i=0;i<PRODUCT_NUM;i++)
   {
   int n= pthread_join(product_id[i],nullptr);
    if(n==0)printf("wait sucess wait tid is:%d\n",product_id[i]);
   }
     for(int i=0;i<CONSUMER_NUM;i++)
   {
   int n= pthread_join(consumer_id[i],nullptr);
    if(n==0)printf("wait sucess wait tid is:%d\n",consumer_id[i]);
   }
    
    return 0;
}